package com.example.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.PostConstruct;

/**
 * 应用配置类
 * 包含 MyBatis-Plus、数据源等配置
 * Spring 启动时会扫描这个类，加载其中的配置
 * 可以在这个类中定义 Bean、配置项等
 */
@Configuration // 告诉 Spring "这是一个配置类"
@MapperScan("com.example.mapper") // 告诉 MyBatis-Plus "去这个包里找所有的 Mapper 接口"
public class AppConfig {

    // 从 application.properties 读取配置项进行调试输出
    @Value("${spring.datasource.url}")
    private String dataSourceUrl;
    
    @Value("${server.port:8085}") // 冒号后面为默认值 8085，自动转为 Integer
    private Integer serverPort;

    @Value("${spring.application.name}")
    private String appName;

    @Value("${spring.profiles.active}")
    private String env;

    @Value("${app.defi.fee:0.01}")
    private Float fee;

    // SpEL表达式用#{}包裹，可做运算、调用方法、获取系统变量等
    // 先注入为 List<String>，再手动转为 List<Double>
    @Value("#{'${app.defi.fees:0.3,0.5,1}'.split(',')}")
    private List<String> feesStr;

    // 转换为 Double 列表
    public List<Double> getFees() {
        return feesStr.stream().map(Double::parseDouble).collect(Collectors.toList());
    }

    // SpEL表达式
    @Value("#{'${app.defi.names:yyy,xxx,mmm}'.split(',')}")
    private List<String> names;

    // SpEL表达式
    @Value("#{2 * 60}") // 计算表达式，结果为120
    private Integer seconds;

    @Value("${app.defi.ratio}")
    private Float ratio;

    @Value("${app.defi.min-amount}")
    private Long minAmount;

    @Value("${app.defi.enabled}")
    private Boolean defiEnabled;

    public AppConfig() {
        System.out.println("构造函数输出: ");
        // 这里会打印 null，因为 @Value 还没注入
        if (serverPort != null) {
            System.out.println("服务端口: " + serverPort);
        } else {
            System.out.println("服务端口尚未注入");
        }
    }

    /**
     * 应用启动后执行，用于调试输出配置项
     * 
     * @PostConstruct 是依赖注入完成后的回调，常用于：
     * - 初始化缓存数据
     * - 验证配置项
     * - 启动后台任务
     * - 调试输出（如当前例子）
     */
    @PostConstruct 
    public void debugConfig() {
        System.out.println("====== 调试输出配置项 ======");
        System.out.println("应用名称: " + appName);
        System.out.printf("服务端口: %d\n", serverPort);
        System.out.println("数据源URL: " + dataSourceUrl);
        System.out.println("当前环境: " + env);

        System.out.println("DeFi功能开关: " + (defiEnabled ? "已启用" : "未启用"));
        System.out.println("DeFi手续费: " + fee);
        System.out.println("DeFi手续费列表: " + getFees());
        System.out.println("DeFi用户列表: " + names);
        System.out.println("DeFi计算秒数: " + seconds);
        System.out.println("DeFi汇率: " + ratio);
        System.out.println("DeFi最小金额: " + minAmount);

        System.out.println("==========================");
    }
}
